7章 トランザクション
トランザクションが提供する安全性の保証(ACID)
原子性(atomicity)
それ以上小さく分割できないこと。
ある複数の書き込みがトランザクションにグループ化されて降り途中で障害により完了(コミット)しなかったなら、そのトランザクションは中断され、データベースはそのトランザクション中でその時点まで行われた書き込みを全て破棄もしくは取り消ししなければならない。
一貫性(consistency)
データについて常に真でなければならない(不変性)
トランザクションが開始され、そのトランザクション中のどの書き込みも適正な状態を保つ
実際にはアプリケーションの特性のため、実際にはACIDに入らない
分離性(isolation)
並行して実行されたトランザクションがお互いから分離されていなければならない。
直列化可能性(serializability)とも呼ぶ。
永続性(durability)
トランザクションのコミットが成功したら、仮にハードウェア障害やデータベースがクラッシュしてもそのトランザクションでの書き込みデータは失われないこと
並行性制御の分離レベル
read commited
ダーティリードが生じない
データベースからの読み取りを行った際に見えるデータはコミットされたもののみであること
ダーティライトが生じない
データベースへの書き込みを行う際、上書きするのはコミットされたデータのみであること
スナップショット分離(snapshot isolation)
トランザクションが読み取るデータは全てそのトランザクションの開始時点のデータベースにコミットされているものだけ
更新のロスト
カーソル固定
オブジェクトからの読み取りの際に排他ロックで更新が適用されるまで他のトランザクションがそのオブジェクトを読めないようにする
明示的なロック
アプリケーションでロックする
書き込みスキュー
別々のトランザクションが同じオブジェクトのレコードから読み取って幾つかの書き込みを行なってレース条件が発生すること
直列化可能スナップショット分離でのみ解決
ファントム
あるトランザクションが検索にマッチするオブジェクトの読み取りを行い、別のトランザクションはその検索結果に書き込みを行い不整合が発生すること
直列化可能なトランザクションの実装方法
トランザクションを順次実行
ツーフェーズロック(2PL)
ダーティライトが生じないことに加えて、ライターは他のライターだけではなく他のリーダーもブロックする(逆も然り)
直列化可能スナップショット分離(SSI, serialize snapshot isolation)
他のトランザクションをブロックしない(コミットするまで)
トランザクションがデータベースへ書き込みを行う際はインデックスを見て直近で他のトランザクションがそのデータを読み取っているかを確認する。
分散データベースでのトランザクションは?